﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using XingFuStudio.Pioneer.Entity;
using System.Configuration;
using System.IO;
using System.Xml.Linq;

namespace XingFuStudio.Pioneer.Applications.City.Config {
    /// <summary>
    /// 城市各用户配置管理类
    /// </summary>
    public class UserConfig {
        /// <summary>
        /// 文件路径
        /// </summary>
        private string filePath = String.Empty;
         
        /// <summary>
        /// 创建一个实例
        /// </summary>
        public UserConfig(AccountInfo account) {
            //获取XML文档所在的文件夹
            string xmlFolder = ConfigurationManager.AppSettings["XmlConfigFolder"];

            //判断是否设置了数据文件夹
            if (String.IsNullOrEmpty(xmlFolder)) {
                xmlFolder = "Config";
            }

            //判断设置的配置文件夹是否存在
            if (!Directory.Exists(xmlFolder)) {
                //不存在,创建数据文件夹
                Directory.CreateDirectory(xmlFolder);
            }

            xmlFolder = xmlFolder + "\\City";
            //判断设置的用户配置文件夹是否存在
            if (!Directory.Exists(xmlFolder)) {
                //不存在,创建数据文件夹
                Directory.CreateDirectory(xmlFolder);
            }

            xmlFolder = xmlFolder + "\\UserConfig";
            //判断设置的用户配置文件夹是否存在
            if (!Directory.Exists(xmlFolder)) {
                //不存在,创建数据文件夹
                Directory.CreateDirectory(xmlFolder);
            }

            //拼接文件路径
            filePath = xmlFolder + "\\" + account.Email + ".xml";

            //判断指定的数据文件是否存在
            if (!File.Exists(filePath)) {
                //初始化指定的数据文件
                XDocument xmlDoc = new XDocument(
                    new XElement("Configs"));

                //存储数据文件
                xmlDoc.Save(filePath);
            }
        }

        /// <summary>
        /// 修改配置项
        /// </summary>
        /// <param name="config"></param>
        /// <returns></returns>
        public bool ModifyConfig(UserConfigSection config) {
            //声明标识
            bool flag = false;

            try {
                    this.DeleteConfig(config.OPName);
                    return this.CreateConfig(config);
            } catch (Exception ex) {
                //添加失败，记录系统运行日志
                System.Diagnostics.Debug.WriteLine(ex.Message);
            }

            return flag;
        }

        /// <summary>
        /// 创建配置项
        /// </summary>
        /// <param name="config"></param>
        /// <returns></returns>
        private bool CreateConfig(UserConfigSection config) {
            //声明标识
            bool flag = false;

            try {
                //获取现有Xml文档数据
                XElement xmlContent = XElement.Load(this.filePath);

                XElement xmlOperation = new XElement("Operation",
                    new XAttribute("Name", config.OPName),
                    new XAttribute("Run", config.IsRun));

                //遍历配置项
                foreach (string key in config.ConfigItems.Keys) {
                    XElement xmlConfig = new XElement("Item",
                        new XAttribute("Key", key),
                        new XAttribute("Value", config.ConfigItems[key]));

                    xmlOperation.Add(xmlConfig);
                }

                //添加到现有Xml中
                xmlContent.Add(xmlOperation);
                //保存Xml文件
                xmlContent.Save(this.filePath);

                flag = true;
            } catch (Exception ex) {
                //添加失败，记录系统运行日志
                System.Diagnostics.Debug.WriteLine(ex.Message);
            }

            return flag;
        }

        /// <summary>
        /// 删除指定配置项
        /// </summary>
        /// <returns>操作是否成功</returns>
        /// <param name="email">Email地址</param>
        private bool DeleteConfig(string opName) {
            //声明标识
            bool flag = false;

            try {
                //获取现有Xml文档数据
                XElement xmlContent = XElement.Load(this.filePath);

                //删除满足条件的帐户信息
                xmlContent.Elements("Operation")
                    .Where(s => s.Attribute("Name").Value.ToLower() == opName.ToLower())
                    .Remove();

                //存储修改后的结果
                xmlContent.Save(this.filePath);

                flag = true;
            } catch (Exception ex) {
                //添加失败，记录系统运行日志
                System.Diagnostics.Debug.WriteLine(ex.Message);
            }

            //返回查询结果
            return flag;
        }

        /// <summary>
        /// 指定配置项是否存在
        /// </summary>
        /// <param name="opName"></param>
        /// <returns></returns>
        private bool ExistConfig(string opName) {
            //声明标识
            bool flag = false;

            try {
                //获取现有Xml文档数据
                XElement xmlContent = XElement.Load(this.filePath);

                //查询满足条件的帐户数量
                int count = xmlContent.Elements("Operation")
                    .Count(s => s.Attribute("Name").Value.ToLower() == opName.ToLower());

                //赋值结果
                flag = count > 0;
            } catch (Exception ex) {
                //添加失败，记录系统运行日志
                System.Diagnostics.Debug.WriteLine(ex.Message);
            }

            //返回查询结果
            return flag;
        }

        /// <summary>
        /// 获取用户配置节列表
        /// </summary>
        /// <returns></returns>
        public List<UserConfigSection> GetUserConfigs() {
            List<UserConfigSection> configs = new List<UserConfigSection>();

            try {
                //获取现有Xml文档数据
                XElement xmlContent = XElement.Load(this.filePath);

                //遍历操作
                foreach (XElement item in xmlContent.Nodes().OfType<XElement>()) {
                    //声明登录帐户信息对象
                    UserConfigSection config = new UserConfigSection();

                    //赋值信息
                    config.OPName = item.Attribute("Name").Value;
                    config.IsRun = Convert.ToBoolean(item.Attribute("Run").Value);

                    //遍历配置
                    foreach (XElement keyValeu in item.Nodes().OfType<XElement>()) {
                        config.ConfigItems.Add(keyValeu.Attribute("Key").Value, keyValeu.Attribute("Value").Value);    
                    }

                    //将信息添加到集合
                    configs.Add(config);
                }
            } catch (Exception ex) {
                //添加失败，记录系统运行日志
                System.Diagnostics.Debug.WriteLine(ex.Message);
            }

            return configs;
        }
    }
}
